/*
 * @Author: 一盏青灯欲锁魂
 * @Date: 2021-06-16 13:51:10
 * @LastEditTime: 2021-06-16 14:50:18
 * @Description: log日志中间件
 * @FilePath: \nest_demo\src\middleware\logger.middleware.ts
 */
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';

/*
    * 1. 中间件的书写定义思路：
    *     1. 从'@nestjs/common'核心库中引入'Injectable'、'NestMiddleware'
    *     2. 从'express'中引入'Request'、'Response'
    *     3. 定义一个class类用以实现'NestMiddleware'并实例化'NestMiddleware'中的属性方法
    *     4. 重写use方法，方法体内部结束必须调用next()
    *     5. 在app.module.ts中导入中间件，进行调用使用
    * 
    * 2. 为什么要引入'Injectable'、'NestMiddleware'？
    *     1. 首先中间件必须在定义之后注入到Nest中才能被启用，所以引入'Injectable'，而'@Injectable()'所装饰
    *        的类是具备注入到Nest模块中的功能
    * 
    *     2. 其次注入的不一定是中间件，所以要引入'NestMiddleware'并通过实现它来明确的告诉Nest框架，我是中间件，
    *        并且实现了Nest内部专门为中间件识别提供的父类'NestMiddleware'
    * 
    * 3. 为什么要引入'Request'、'Response'？
    *     1. 这个其实是随意的，你引入'express'或者是'fastify'都可以，根据你自身想法来
    *     2. 引入'Request'、'Response'是这里想获取用户操作交互时，获取到交互的路由信息和返回值信息，然后把信息拿到记录在日志上
    * 
    * 注意：
    *     1. 不管是'express'或者是'fastify'，它都是Http请求框架的一种
    *     2. Nest默认底层集成了'express'
    * 
    * 4. 为什么use()函数体内部结束必须调用next()?
    *     1. 正常项目开发中，中间件不会有且仅有一个，调用next()就是为了能够执行下一个中间件
*/ 

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
    use(req: Request, res: Response, next: () => void) {
        const { method, path } = req;
        console.log(`${method} ${path}`);
        next();
    }
}